package crawler;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: 张德长 dechang.zhang@ucarinc.com
 * @date: 9:53:22 2018/11/9
 * @version:2.0
 */
public class Test {
    public static int windowWidth = 1920;
    public static int windowHeight = 1080;

    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--headless");
        options.addArguments("--disable-gpu");
        System.setProperty("webdriver.chrome.driver", "src\\\\main\\\\java\\\\crawler\\\\chromedriver.exe");//chromedriver服务地址
        WebDriver driver = new ChromeDriver(options); //新建一个WebDriver 的对象，但是new 的是FirefoxDriver的驱动driver
        Dimension dimension = new Dimension(windowWidth, windowHeight);
        driver.manage().window().setSize(dimension);
        driver.get("http://www.baidu.com");//打开指定的网站
        String title = driver.getTitle();
        System.out.println(title);
        /**
         * 截屏操作
         * 图片已当前时间命名
         */
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");  //转换时间格式
        String time = dateFormat.format(Calendar.getInstance().getTime());  //获取当前时间
        File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);  //执行屏幕截取
        try {
            FileUtils.copyFile(srcFile, new File("屏幕截图", time + ".png")); //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件;"屏幕截图"即时保存截图的文件夹
        } catch (IOException e) {
            e.printStackTrace();
        }

       /*
       定位方法
Java语言实现实例
driver.findElement(By.id(“id的值”))；
name定位
driver.findElement(By.name(“name的值”))；
链接的全部文字定位
driver.findElement(By.linkText(“链接的全部文字”))；
链接的部分文字定位
driver.findElement(By.partialLinkText(“链接的部分文字”))；
css 方式定位
driver.findElement(By.cssSelector(“css表达式”))；
xpath 方式定位
driver.findElement(By.xpath(“xpath表达式”))；
Class 名称定位
driver.findElement(By.className(“class属性”))；
TagName 标签名称定位
driver.findElement(By.tagName(“标签名称”))；
通常使用findElement或findElements方法结合By类返回元素句柄来定位元素
findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException()
findElements()方法返回多个元素, 如果没有找到,会返回空数组, 不会抛出异常
策略是， 选择简单，稳定的定位方法。
1. 当页面元素有id属性的时候， 尽量使用id来定位。  没有的话，再选择其他定位方法
2. cssSelector  执行速度快， 推荐使用
3. 定位超链接的时候，可以考虑linkText或partialLinkText：　但是要注意的是 ，  文本经常发生改变，　所以不推荐用
3. xpath 功能最强悍。 当时执行速度慢，因为需要查找整个DOM,  所以尽量少用。  实在没有办法的时候，才使用xpath
 //移动到元素element对象的“顶端”与当前窗口的“顶部”对齐
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
 //移动到元素element对象的“底端”与当前窗口的“底部”对齐
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", element);
//移动到页面最底部
 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)");
 //移动到指定的坐标(相对当前的坐标移动)
((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 700)");
Thread.sleep(3000);
//结合上面的scrollBy语句，相当于移动到700+800=1600像素位置
 ((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 800)");
//移动到窗口绝对位置坐标，如下移动到纵坐标1600像素位置
 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1600)");
 Thread.sleep(3000);
 //结合上面的scrollTo语句，仍然移动到纵坐标1200像素位置
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 1200)");
       * */
        driver.findElement(By.id("kw")).sendKeys(new String[]{"hello"});//找到kw元素的id，然后输入hello
        driver.findElement(By.id("su")).click(); //点击按扭
        try {
            /**
             * WebDriver自带了一个智能等待的方法。
             dr.manage().timeouts().implicitlyWait(arg0, arg1）；
             Arg0：等待的时间长度，int 类型 ；
             Arg1：等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。
             */
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别：第一个close，
         * 如果打开了多个页面是关不干净的，它只关闭当前的一个页面。第二个quit，
         * 是退出了所有Webdriver所有的窗口，退的非常干净，所以推荐使用quit最为一个case退出的方法。
         */
        // driver.quit();//退出浏览器
    }

    public void screenShotForElement(WebDriver driver, WebElement element, String path, int x, int y) {
        //截取整个页面的图片
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        try {
            //获取元素在所处frame中位置对象
            Point p = element.getLocation();
            //获取元素的宽与高
            int width = element.getSize().getWidth();
            int height = element.getSize().getHeight();
            //矩形图像对象
            //Rectangle rect = new Rectangle(width, height);
            //从文件读取BufferedImage
            BufferedImage img = ImageIO.read(scrFile);
            //x、y表示加上当前frame的左边距,上边距
            BufferedImage dest = img.getSubimage(p.getX() + x, p.getY() + y, width, height);
            ImageIO.write(dest, "png", scrFile);
            FileUtils.copyFile(scrFile, new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}